package com.wpen.unit.infra.repository.job.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;

import java.io.Serializable;
import java.util.List;

import com.wpen.unit.infra.repository.job.TaskInfoRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.wpen.unit.exception.UpdateZeroException;
import com.wpen.unit.infra.mybatis.job.mapper.TaskInfoMapper;
import com.wpen.unit.infra.mybatis.job.po.TaskInfoPo;
import com.wpen.unit.infra.mybatis.job.po.TaskInfoPo.TaskInfoColumns;
import com.wpen.unit.utils.StringUtil;

/**
 * 任务信息维护.
 * 
 * @author pg
 *
 */
@Repository
@Transactional
public class TaskInfoRepositoryImpl extends ServiceImpl<TaskInfoMapper, TaskInfoPo> implements TaskInfoRepository {

    @Override
    public TaskInfoPo queryByCode(String bizCode, String batchCode, String taskCode) {
        QueryWrapper<TaskInfoPo> queryWrapper = Wrappers.query();
        queryWrapper.eq(TaskInfoColumns.BIZ_CODE.name(), bizCode);
        queryWrapper.eq(TaskInfoColumns.BATCH_CODE.name(), batchCode);
        queryWrapper.eq(TaskInfoColumns.TASK_CODE.name(), taskCode);
        return super.getOne(queryWrapper);
    }

    @Override
    public long count(TaskInfoPo taskInfoPo) {
        QueryWrapper<TaskInfoPo> queryWrapper = createQuery(taskInfoPo);
        return super.count(queryWrapper);
    }

    @Override
    public List<TaskInfoPo> queryList(int index, int size, TaskInfoPo taskInfoPo) {
        QueryWrapper<TaskInfoPo> queryWrapper = createQuery(taskInfoPo);
        if (size > 0) {
            Page<TaskInfoPo> page = new Page<>(index, size, false);
            return super.page(page, queryWrapper).getRecords();
        }
        // queryWrapper.orderBy(true, false, BatchInfoPoColumns.ID.name());
        return getBaseMapper().selectList(queryWrapper);
    }

    private QueryWrapper<TaskInfoPo> createQuery(TaskInfoPo taskInfoPo) {
        QueryWrapper<TaskInfoPo> queryWrapper = Wrappers.query();
        if (taskInfoPo.getId() != null) {
            queryWrapper.eq(TaskInfoColumns.ID.name(), taskInfoPo.getId());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getBizCode())) {
            queryWrapper.eq(TaskInfoColumns.BIZ_CODE.name(), taskInfoPo.getBizCode());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getBatchCode())) {
            queryWrapper.eq(TaskInfoColumns.BATCH_CODE.name(), taskInfoPo.getBatchCode());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getTaskCode())) {
            queryWrapper.eq(TaskInfoColumns.TASK_CODE.name(), taskInfoPo.getTaskCode());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getScheduleType())) {
            queryWrapper.eq(TaskInfoColumns.SCHEDULE_TYPE.name(), taskInfoPo.getScheduleType());
        }
        // if (StringUtil.isNotEmpty(taskInfoPo.getScheduleConf())) {
        // queryWrapper.eq(TaskInfoColumns.SCHEDULE_CONF.name(),
        // taskInfoPo.getScheduleConf());
        // }
        // if (taskInfoPo.getOrders() != null) {
        // queryWrapper.eq(TaskInfoColumns.ORDERS.name(), taskInfoPo.getOrders());
        // }
        if (StringUtil.isNotEmpty(taskInfoPo.getEnabled())) {
            queryWrapper.eq(TaskInfoColumns.ENABLED.name(), taskInfoPo.getEnabled());
        }
        // if (StringUtil.isNotEmpty(taskInfoPo.getTaskDesc())) {
        // queryWrapper.eq(TaskInfoColumns.TASK_DESC.name(), taskInfoPo.getTaskDesc());
        // }
        if (StringUtil.isNotEmpty(taskInfoPo.getAppMode())) {
            queryWrapper.eq(TaskInfoColumns.APP_MODE.name(), taskInfoPo.getAppMode());
        }
        // if (StringUtil.isNotEmpty(taskInfoPo.getAppJarName())) {
        // queryWrapper.eq(TaskInfoColumns.APP_JAR_NAME.name(),
        // taskInfoPo.getAppJarName());
        // }
        if (taskInfoPo.getStartupMaxDelay() != null) {
            queryWrapper.eq(TaskInfoColumns.STARTUP_MAX_DELAY.name(), taskInfoPo.getStartupMaxDelay());
        }
        if (taskInfoPo.getExeTimeout() != null) {
            queryWrapper.eq(TaskInfoColumns.EXE_TIMEOUT.name(), taskInfoPo.getExeTimeout());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getFailIgnore())) {
            queryWrapper.eq(TaskInfoColumns.FAIL_IGNORE.name(), taskInfoPo.getFailIgnore());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getAppRunMode())) {
            queryWrapper.eq(TaskInfoColumns.APP_RUN_MODE.name(), taskInfoPo.getAppRunMode());
        }
        // if (StringUtil.isNotEmpty(taskInfoPo.getAppStartupCmd())) {
        // queryWrapper.eq(TaskInfoColumns.APP_STARTUP_CMD.name(),
        // taskInfoPo.getAppStartupCmd());
        // }
        // if (StringUtil.isNotEmpty(taskInfoPo.getDataCenterInstNums())) {
        // queryWrapper.eq(TaskInfoColumns.DATA_CENTER_INST_NUMS.name(),
        // taskInfoPo.getDataCenterInstNums());
        // }
        // if (taskInfoPo.getOneInstThreadNum() != null) {
        // queryWrapper.eq(TaskInfoColumns.ONE_INST_THREAD_NUM.name(),
        // taskInfoPo.getOneInstThreadNum());
        // }
        if (taskInfoPo.getCreateTime() != null) {
            queryWrapper.eq(TaskInfoColumns.CREATE_TIME.name(), taskInfoPo.getCreateTime());
        }
        if (taskInfoPo.getVersion() != null) {
            queryWrapper.eq(TaskInfoColumns.VERSION.name(), taskInfoPo.getVersion());
        }
        return queryWrapper;
    }

    @Override
    public TaskInfoPo queryFirst(TaskInfoPo taskInfoPo) {
        QueryWrapper<TaskInfoPo> queryWrapper = Wrappers.query();
        if (taskInfoPo.getId() != null) {
            queryWrapper.eq(TaskInfoColumns.ID.name(), taskInfoPo.getId());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getBizCode())) {
            queryWrapper.eq(TaskInfoColumns.BIZ_CODE.name(), taskInfoPo.getBizCode());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getBatchCode())) {
            queryWrapper.eq(TaskInfoColumns.BATCH_CODE.name(), taskInfoPo.getBatchCode());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getTaskCode())) {
            queryWrapper.eq(TaskInfoColumns.TASK_CODE.name(), taskInfoPo.getTaskCode());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getScheduleType())) {
            queryWrapper.eq(TaskInfoColumns.SCHEDULE_TYPE.name(), taskInfoPo.getScheduleType());
        }
        // if (StringUtil.isNotEmpty(taskInfoPo.getScheduleConf())) {
        // queryWrapper.eq(TaskInfoColumns.SCHEDULE_CONF.name(),
        // taskInfoPo.getScheduleConf());
        // }
        // if (taskInfoPo.getOrders() != null) {
        // queryWrapper.eq(TaskInfoColumns.ORDERS.name(), taskInfoPo.getOrders());
        // }
        if (StringUtil.isNotEmpty(taskInfoPo.getEnabled())) {
            queryWrapper.eq(TaskInfoColumns.ENABLED.name(), taskInfoPo.getEnabled());
        }
        // if (StringUtil.isNotEmpty(taskInfoPo.getTaskDesc())) {
        // queryWrapper.eq(TaskInfoColumns.TASK_DESC.name(), taskInfoPo.getTaskDesc());
        // }
        if (StringUtil.isNotEmpty(taskInfoPo.getAppMode())) {
            queryWrapper.eq(TaskInfoColumns.APP_MODE.name(), taskInfoPo.getAppMode());
        }
        // if (StringUtil.isNotEmpty(taskInfoPo.getAppJarName())) {
        // queryWrapper.eq(TaskInfoColumns.APP_JAR_NAME.name(),
        // taskInfoPo.getAppJarName());
        // }
        if (taskInfoPo.getStartupMaxDelay() != null) {
            queryWrapper.eq(TaskInfoColumns.STARTUP_MAX_DELAY.name(), taskInfoPo.getStartupMaxDelay());
        }
        if (taskInfoPo.getExeTimeout() != null) {
            queryWrapper.eq(TaskInfoColumns.EXE_TIMEOUT.name(), taskInfoPo.getExeTimeout());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getFailIgnore())) {
            queryWrapper.eq(TaskInfoColumns.FAIL_IGNORE.name(), taskInfoPo.getFailIgnore());
        }
        if (StringUtil.isNotEmpty(taskInfoPo.getAppRunMode())) {
            queryWrapper.eq(TaskInfoColumns.APP_RUN_MODE.name(), taskInfoPo.getAppRunMode());
        }
        // if (StringUtil.isNotEmpty(taskInfoPo.getAppStartupCmd())) {
        // queryWrapper.eq(TaskInfoColumns.APP_STARTUP_CMD.name(),
        // taskInfoPo.getAppStartupCmd());
        // }
        // if (StringUtil.isNotEmpty(taskInfoPo.getDataCenterInstNums())) {
        // queryWrapper.eq(TaskInfoColumns.DATA_CENTER_INST_NUMS.name(),
        // taskInfoPo.getDataCenterInstNums());
        // }
        // if (taskInfoPo.getOneInstThreadNum() != null) {
        // queryWrapper.eq(TaskInfoColumns.ONE_INST_THREAD_NUM.name(),
        // taskInfoPo.getOneInstThreadNum());
        // }
        if (taskInfoPo.getCreateTime() != null) {
            queryWrapper.eq(TaskInfoColumns.CREATE_TIME.name(), taskInfoPo.getCreateTime());
        }
        if (taskInfoPo.getVersion() != null) {
            queryWrapper.eq(TaskInfoColumns.VERSION.name(), taskInfoPo.getVersion());
        }
        // queryWrapper.orderBy(true, false, TaskInfoPoColumns.ID.name());
        return super.getOne(queryWrapper);
    }

    @Override
    public TaskInfoPo queryById(Serializable id) {
        return super.getById(id);
    }

    @Override
    public boolean insert(TaskInfoPo taskInfoPo) {
        taskInfoPo.setVersion(1);
        taskInfoPo.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
        return super.save(taskInfoPo);
    }

    @Override
    public boolean insertBatch(List<TaskInfoPo> listTaskInfoPos) {
        int rs = getBaseMapper().insertBatchSomeColumn(listTaskInfoPos);
        return SqlHelper.retBool(rs);
    }

    @Override
    public boolean updateById(TaskInfoPo taskInfoPo) {
        UpdateWrapper<TaskInfoPo> updateWrapper = Wrappers.update();
        updateWrapper.eq(TaskInfoColumns.ID.name(), taskInfoPo.getId());
        updateWrapper.eq(TaskInfoColumns.VERSION.name(), taskInfoPo.getVersion());
        taskInfoPo.setVersion(taskInfoPo.getVersion() + 1);
        boolean rs = super.update(taskInfoPo, updateWrapper);
        // 根据ID更新所有字段，空值也更新
//         int num = getBaseMapper().alwaysUpdateSomeColumnById(taskInfoPo);
//         boolean rs = SqlHelper.retBool(num);
        if (!rs) {
            throw new UpdateZeroException();
        }
        return rs;
    }

    @Override
    public boolean updateByIdWithEmpty(TaskInfoPo taskInfoPo) {
        UpdateWrapper<TaskInfoPo> updateWrapper = Wrappers.update();
        updateWrapper.eq(TaskInfoColumns.ID.name(), taskInfoPo.getId());
        updateWrapper.eq(TaskInfoColumns.VERSION.name(), taskInfoPo.getVersion());
        taskInfoPo.setVersion(taskInfoPo.getVersion() + 1);
//        boolean rs = super.update(taskInfoPo, updateWrapper);
        // 根据ID更新所有字段，空值也更新
        int num = getBaseMapper().alwaysUpdateSomeColumnById(taskInfoPo);
        boolean rs = SqlHelper.retBool(num);
        if (!rs) {
            throw new UpdateZeroException();
        }
        return rs;
    }

    @Override
    public boolean deleteByIds(Serializable[] ids) {
        UpdateWrapper<TaskInfoPo> updateWrapper = Wrappers.update();
        updateWrapper.in(TaskInfoColumns.ID.name(), (Object[]) ids);
        return super.remove(updateWrapper);
    }

//    public TaskInfoPo queryByExample(TaskInfoPo taskInfoPo) {
//        QueryWrapper<TaskInfoPo> queryWrapper = Wrappers.query();
//        if (taskInfoPo.getId() != null) {
//            queryWrapper.eq(TaskInfoColumns.ID.name(), taskInfoPo.getId());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getBizCode())) {
//            queryWrapper.eq(TaskInfoColumns.BIZ_CODE.name(), taskInfoPo.getBizCode());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getBatchCode())) {
//            queryWrapper.eq(TaskInfoColumns.BATCH_CODE.name(), taskInfoPo.getBatchCode());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getTaskCode())) {
//            queryWrapper.eq(TaskInfoColumns.TASK_CODE.name(), taskInfoPo.getTaskCode());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getScheduleType())) {
//            queryWrapper.eq(TaskInfoColumns.SCHEDULE_TYPE.name(), taskInfoPo.getScheduleType());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getScheduleConf())) {
//            queryWrapper.eq(TaskInfoColumns.SCHEDULE_CONF.name(), taskInfoPo.getScheduleConf());
//        }
//        if (taskInfoPo.getOrders() != null) {
//            queryWrapper.eq(TaskInfoColumns.ORDERS.name(), taskInfoPo.getOrders());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getEnabled())) {
//            queryWrapper.eq(TaskInfoColumns.ENABLED.name(), taskInfoPo.getEnabled());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getTaskDesc())) {
//            queryWrapper.eq(TaskInfoColumns.TASK_DESC.name(), taskInfoPo.getTaskDesc());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getAppMode())) {
//            queryWrapper.eq(TaskInfoColumns.APP_MODE.name(), taskInfoPo.getAppMode());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getAppJarName())) {
//            queryWrapper.eq(TaskInfoColumns.APP_JAR_NAME.name(), taskInfoPo.getAppJarName());
//        }
//        if (taskInfoPo.getStartupMaxDelay() != null) {
//            queryWrapper.eq(TaskInfoColumns.STARTUP_MAX_DELAY.name(), taskInfoPo.getStartupMaxDelay());
//        }
//        if (taskInfoPo.getExeTimeout() != null) {
//            queryWrapper.eq(TaskInfoColumns.EXE_TIMEOUT.name(), taskInfoPo.getExeTimeout());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getFailIgnore())) {
//            queryWrapper.eq(TaskInfoColumns.FAIL_IGNORE.name(), taskInfoPo.getFailIgnore());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getAppRunMode())) {
//            queryWrapper.eq(TaskInfoColumns.APP_RUN_MODE.name(), taskInfoPo.getAppRunMode());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getAppStartupCmd())) {
//            queryWrapper.eq(TaskInfoColumns.APP_STARTUP_CMD.name(), taskInfoPo.getAppStartupCmd());
//        }
//        if (StringUtil.isNotEmpty(taskInfoPo.getDataCenterInstNums())) {
//            queryWrapper.eq(TaskInfoColumns.DATA_CENTER_INST_NUMS.name(), taskInfoPo.getDataCenterInstNums());
//        }
//        if (taskInfoPo.getOneInstThreadNum() != null) {
//            queryWrapper.eq(TaskInfoColumns.ONE_INST_THREAD_NUM.name(), taskInfoPo.getOneInstThreadNum());
//        }
//        if (taskInfoPo.getAddTime() != null) {
//            queryWrapper.eq(TaskInfoColumns.ADD_TIME.name(), taskInfoPo.getAddTime());
//        }
//        if (taskInfoPo.getVersion() != null) {
//            queryWrapper.eq(TaskInfoColumns.VERSION.name(), taskInfoPo.getVersion());
//        }
//		Page<TaskInfoPo> page = new Page<>(0, 1, false);
//		queryWrapper.orderBy(true, false, TaskInfoPoColumns.ID.name());
//    }

}
